leetcode C语言第二例 求和

您所在的位置:网站首页 c语言 求和函数 leetcode C语言第二例 求和

leetcode C语言第二例 求和

2022-06-03 02:32| 来源: 网络整理| 查看: 265

🤷‍♂️题目一:

剑指 Offer 64. 求1+2+…+n

求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

此题有许多限制条件,导致许多方法难以奏效,要解决此题,首先我们得知道一个字符&&的意义:

🧐知识点补充:

     &&和||的介绍:

&& 和 || 是逻辑运算符,分别是逻辑与(&&)和逻辑或(||)

1) && (逻辑与):(三种)

① 当逻辑与左边为false,则不再进行逻辑与右边的判断,结果为false

② 当逻辑与左边为true,则进行右边判断,右边为false,结果为false

③ 当逻辑与左边为true,则进行右边判断,右边也为true,则结果为true

2) || (逻辑或):(三种)

① 当逻辑或左边为false,继续逻辑或右边的判断,如果也为false,结果为false

② 当逻辑或左边为false,继续逻辑或右边的判断,如果为true,结果为true

③ 当逻辑或左边为true,则不再进行逻辑或右边的判断,结果为true

看似好像都明白,但这题的题解可能会刷新你的认知

👍题解代码:

int sumNums(int n){   n && (n += sumNums(n - 1));   return n; }

当n=0时递归不执行,但这段代码看似会死循环,但我们深入剖析就能一探究竟,&&语句中的n与return中的n并不是同一个n,当第一句代码执行时,程序开始递归,n-1传进递归中,此时第一层递归的n实际是n-1,而后继续直至n=0,然后开始返回每层递归的n值,这就是这串代码的含义。

🤷‍♀️题目二:

剑指 Offer 57 - II. 和为s的连续正数序列

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

这题大体上并不难,用暴力查找即可,但一出问题的就是动态内存开辟,c语言中至关重要的两个点就是指针和动态内存管理

🧐知识点补充:

     

       🐰二维数组的实质:

 其实二维数组本质上还是一维数组,但它里面的元素是数组,这也解释了leetcode数组传参是出现二级指针的现象

     

      🐭 malloc函数的讲解:

malloc是动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址

函数原型:

extern void *malloc(unsigned int num_bytes) ;//num_bytes表示分配的长度 ​

malloc如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

重点:在使用malloc开辟空间时,使用完成一定要释放空间,如果不释放会造内存泄漏。 在使用malloc函数开辟的空间中,不要进行指针的移动,因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配

使用形式:

mallo函数返回的实际是一个无类型指针,必须在其前面加上指针类型强制转换才可以使用 指针自身 = (指针类型)malloc(sizeof(指针类型)数据数量)

在使用malloc开辟一段空间之后,系统会在这段空间之前做一个标记(0或1),当malloc函数开辟空间如果遇到标记为0就在此开辟,如果为1说明此空间正在被使用。

   

       🐹 free函数讲解:

malloc函数后面通常是跟着free函数,所以一起进行讲解

作用:释放malloc(或calloc、realloc)函数给指针变量分配的内存空间。 注意:使用后该指针变量一定要重新指向NULL,防止悬空指针(失效指针)出现,有效规避错误操作。

​ int *p = (int *)malloc(sizeof(int)); *p = 100; free(p); p = NULL; ​

free函数在释放空间之后,把内存前的标志变为0,且为了防止数据泄露,它会把所释放的空间用cd进行填充。

👍解题代码:

int** findContinuousSequence(int target, int* returnSize, int** returnColumnSizes){ int** result = (int**)malloc(sizeof(int*) * target); int* col = (int*)malloc(sizeof(int) * target); int t=target/2; int i=0;int j=0; int c=0;int size=0; for(i=1;i=target)       break;   }   if(sum==target)   {     result[c]=(int*)malloc(sizeof(int*)* count);     int k=0;     for(j=i;j


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3